package cn.kinoko.common.utils;


import lombok.Getter;

/**
 * @author kinoko
 */
@Getter
public class PageHelper {

    public PageHelper(int totalCount, int pageSize) {
        this.totalCount = totalCount;
        this.pageSize = pageSize;
        this.totalPages = PageHelper.getTotalPages(totalCount, pageSize);
        this.page = 1;
    }

    private final int totalCount;
    private final int pageSize;
    private final int totalPages;
    private int page;

    /**
     * 初始化分页器
     *
     * @param totalCount 总数据量
     * @param pageSize 分页大小
     * @return 分页对象
     */
    public static PageHelper init(int totalCount, int pageSize) {
        return new PageHelper(totalCount, pageSize);
    }

    /**
     * 下一页
     *
     * @return 分页对象
     */
    public PageHelper nextPage() {
        if (page < totalPages) {
            page++;
        }
        return this;
    }

    /**
     * 上一页
     *
     * @return 分页对象
     */
    public PageHelper prevPage() {
        if (page > 1) {
            page--;
        }
        return this;
    }

    /**
     * 获取起始索引
     *
     * @return 起始索引
     */
    public int getStartIndex() {
        return PageHelper.getStartIndex(page, pageSize);
    }

    /**
     * 获取结束索引
     *
     * @return 结束索引
     */
    public int getEndIndex() {
        return PageHelper.getEndIndex(getStartIndex(), pageSize, totalCount);
    }

    /**
     * 是否有下一页
     *
     * @return 是否有下一页
     */
    public boolean havNext() {
        return page <= totalPages;
    }

    /**
     * 计算总页数
     *
     * @param totalCount 总数据量
     * @param pageSize 分页大小
     * @return 总页数
     */
    public static int getTotalPages(int totalCount, int pageSize) {
        return (int) Math.ceil((double) totalCount / pageSize);
    }

    /**
     * 计算起始索引
     *
     * @param pageNumber 页码
     * @param pageSize 分页大小
     * @return 起始索引
     */
    public static int getStartIndex(int pageNumber, int pageSize) {
        return (pageNumber - 1) * pageSize;
    }

    /**
     * 计算结束索引
     *
     * @param startIndex 起始索引
     * @param pageSize 分页大小
     * @param totalCount 总数据量
     * @return 结束索引
     */
    public static int getEndIndex(int startIndex, int pageSize, int totalCount) {
        return Math.min(startIndex + pageSize - 1, totalCount - 1);
    }

}